/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package de.workingtimemanager.urb.excel;

import de.workingtimemanager.urb.entities.Project;
import de.workingtimemanager.urb.entities.User;
import java.io.File;
import java.io.IOException;
import java.util.Locale;
import jxl.CellView;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.format.UnderlineStyle;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import jxl.write.Number;

/**
 *
 * @author CK05102
 */
public class ExcelWriter {

    private WritableCellFormat timesBoldUnderline;
    private WritableCellFormat times;
    private String inputFile;

    public ExcelWriter(String inputFile) throws WriteException {
        this.inputFile = inputFile;
        //         Lets create a times font
        WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10);
        // Define the cell format
        times = new WritableCellFormat(times10pt);
        // Lets automatically wrap the cells
        times.setWrap(true);
//FIXME
        CellView cv = new CellView();
        cv.setFormat(times);
        cv.setAutosize(true);
    }

    
    public void setOutputFile(String inputFile) {
        this.inputFile = inputFile;
    }

    public void write() throws IOException, WriteException {
        File file = new File(inputFile);
        WorkbookSettings wbSettings = new WorkbookSettings();

        wbSettings.setLocale(new Locale("en", "EN"));

        WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings);
        workbook.createSheet("Report", 0);
        WritableSheet excelSheet = workbook.getSheet(0);
        createLabel(excelSheet);
        createContent(excelSheet);

        workbook.write();
        workbook.close();
    }

    public void write(User user) throws IOException, WriteException {
        File file = new File(inputFile);
//        if(file.exists()){
//            file.delete();
//        }
//        
        WorkbookSettings wbSettings = new WorkbookSettings();

        wbSettings.setLocale(new Locale("en", "EN"));//CARE de wont work!!!!!!!

        WritableWorkbook workbook = Workbook.createWorkbook(file, wbSettings);
        //TODO: für jedes projekt ein sheet erzeugen
//        workbook.createSheet(user.getUSERNAME(), 0);
        for (int i = 1; i < user.getProjects().size(); i++) {
            workbook.createSheet(user.getProjects().elementAt(i).getProjectName(), i - 1);
            WritableSheet excelSheet = workbook.getSheet(i - 1);
            createLabel(excelSheet, user.getProjects().elementAt(i));
            createContent(excelSheet, user.getProjects().elementAt(i));
        }

        workbook.write();
        workbook.close();
    }

    private void createLabel(WritableSheet sheet, Project project) throws WriteException {
        // Write a few headers
        addLabel(sheet, 0, 0, project.getProjectName());
        addLabel(sheet, 1, 0, project.getProjectNumber());
        addLabel(sheet, 0, 2, "Date");
        addLabel(sheet, 1, 2, "Starttime");
        addLabel(sheet, 2, 2, "Endtime");
        addLabel(sheet, 3, 2, "Duration");

    }

    private void createLabel(WritableSheet sheet)
            throws WriteException {
        // Lets create a times font
        WritableFont times10pt = new WritableFont(WritableFont.TIMES, 10);
        // Define the cell format
        times = new WritableCellFormat(times10pt);
        // Lets automatically wrap the cells
        times.setWrap(true);

        // Create create a bold font with unterlines
        WritableFont times10ptBoldUnderline = new WritableFont(
                WritableFont.TIMES, 10, WritableFont.BOLD, false,
                UnderlineStyle.SINGLE);
        timesBoldUnderline = new WritableCellFormat(times10ptBoldUnderline);
        // Lets automatically wrap the cells
        timesBoldUnderline.setWrap(true);

        CellView cv = new CellView();
        cv.setFormat(times);
        cv.setFormat(timesBoldUnderline);
        cv.setAutosize(true);

        // Write a few headers
        addCaption(sheet, 0, 0, "Header 1");
        addCaption(sheet, 1, 0, "This is another header");
    }

    private void createContent(WritableSheet sheet, Project project) throws WriteException,
            RowsExceededException {
        //TODO: pname und pnumber einfügen
        //TODO: für jeden wday einträge
        int columnIdx = 0;
        int rowIdx = 3;
        //TODO: für EIN projekt überschriften erzeugen

        for (int i = 1; i < project.getDays().size(); i++) {
//            String withTime = project.getDays().elementAt(i).getDATE();
//            String withoutTime = withTime.substring(0, withTime.indexOf(" "));
            addLabel(sheet, columnIdx, rowIdx, project.getDays().elementAt(i).getDATE());
//            addLabel(sheet, columnIdx, rowIdx, withoutTime);
            addLabel(sheet, ++columnIdx, rowIdx, project.getDays().elementAt(i).getSTARTTIME());
            addLabel(sheet, ++columnIdx, rowIdx, project.getDays().elementAt(i).getENDTIME());
            addLabel(sheet, ++columnIdx, rowIdx, project.getDays().elementAt(i).getDURATION());
            columnIdx = 0;
            rowIdx++;
        }
    }

    private void createContent(WritableSheet sheet) throws WriteException,
            RowsExceededException {
        // Write a few number
        for (int i = 1; i < 10; i++) {
            // First column
            addNumber(sheet, 0, i, i + 10);
            // Second column
            addNumber(sheet, 1, i, i * i);
        }
        // Lets calculate the sum of it
        StringBuffer buf = new StringBuffer();
        buf.append("SUM(A2:A10)");
        Formula f = new Formula(0, 10, buf.toString());
        sheet.addCell(f);
        buf = new StringBuffer();
        buf.append("SUM(B2:B10)");
        f = new Formula(1, 10, buf.toString());
        sheet.addCell(f);

        // Now a bit of text
        for (int i = 12; i < 20; i++) {
            // First column
            addLabel(sheet, 0, i, "Boring text " + i);
            // Second column
            addLabel(sheet, 1, i, "Another text");
        }
    }

    private void addCaption(WritableSheet sheet, int column, int row, String s)
            throws RowsExceededException, WriteException {
        Label label;
        label = new Label(column, row, s, timesBoldUnderline);
        sheet.addCell(label);
    }

    private void addNumber(WritableSheet sheet, int column, int row,
            Integer integer) throws WriteException, RowsExceededException {
        Number number;
        number = new Number(column, row, integer, times);
        sheet.addCell(number);
    }

    private void addLabel(WritableSheet sheet, int column, int row, String s)
            throws WriteException, RowsExceededException {
        Label label;
        label = new Label(column, row, s, times);
        sheet.addCell(label);
    }

}
